#include <iostream>
#include <sstream>
#include <stdlib.h>
#include <stdio.h>
#include <vector>
#include <sys/time.h>

#include    <cstdlib>
#include    <ctime>
#include    <sys/timeb.h>

using namespace std;
unsigned long long operaciones;

struct tupla{
        int costo;
        int tiempo;
        int posicion;
};



void merge(tupla*,tupla*,int,int,int);
void mergesort(tupla *a, tupla*b, int low, int high)
{
    int pivot;
    if(low<high)
    {
        pivot=(low+high)/2;
        mergesort(a,b,low,pivot);
        mergesort(a,b,pivot+1,high);
        merge(a,b,low,pivot,high);
        operaciones += 4;
        
    }
}
void merge(tupla *a,tupla *b, int low, int pivot, int high)
{
    int k;
    int h=low;
    int i=low;
    int j=pivot+1;
        operaciones +=8;
    while((h<=pivot)&&(j<=high))
    {
                operaciones += 3;
                
        double elemento_i = (double)a[h].costo / (double)a[h].tiempo;
        double elemento_j = (double)a[j].costo / (double)a[j].tiempo;
        
        
        if( elemento_i>= elemento_j  )
        {
            b[i]=a[h];
            h++;
            operaciones+= 3;
        }
        else
        {
            b[i]=a[j];
            j++;
            operaciones+= 3;
        }
        i++;
        operaciones+= 11;
    }
    if(h>pivot)
    {
        for(k=j; k<=high; k++)
        {
            b[i]=a[k];
            i++;
            operaciones +=5;
        }
    }
    else
    {
        for(k=h; k<=pivot; k++)
        {
            b[i]=a[k];
            i++;
            operaciones +=7;
        }
    }
    operaciones++;
    for(k=low; k<=high; k++) {
                a[k]=b[k];
                operaciones +=4;
        }
    
    
}


unsigned long long int ordenarJoyas(tupla* joyas, int cantJoyas){
        
        unsigned long long int perdida = 0;
        
        tupla* auxiliarParaOrdenar = new tupla[cantJoyas];
        
        operaciones += cantJoyas+1;
        
        mergesort(joyas,auxiliarParaOrdenar,0, cantJoyas-1);
    
        //Guardo la sumatoria de los di para evitar calcularla varias veces
        unsigned long long int sumatoriaCostos = 0;
        for(int k = 0; k<cantJoyas ; k++)
                sumatoriaCostos += joyas[k].costo;
    
    
        for(int k = 0;k<cantJoyas;k++){
        //SUM di * tk  para la joya k la perdida es la suma de los di por el tiempo de construccion de la joya k
        perdida += sumatoriaCostos * joyas[k].tiempo;
        //resto a la suma de los di la joya que se construyo
        //Sum di - dk para sacar la que ya construi
        sumatoriaCostos -= joyas[k].costo;
    }
        return perdida;
        
}


int main(int argc, char *argv[]){
        
    string line;
        bool primerLinea = true;
        int cantJoyas = 0;
        int i = 0;
    tupla* joyas = NULL;
        //Si no llegue al final del archivo y sigo obteniendo lineas sigo guardando
        while ( getline (cin,line) )
        {
        if(i == cantJoyas && !primerLinea) {
            timeval tm1, tm2;
            
            gettimeofday(&tm1, NULL);
            unsigned long long int perdida = ordenarJoyas(joyas,cantJoyas);
            gettimeofday(&tm2, NULL);
            unsigned long long t = 1000 * (tm2.tv_sec - tm1.tv_sec) + (tm2.tv_usec - tm1.tv_usec) / 1000;
            
            for (int j=0; j<cantJoyas; j++) {
                cout << joyas[j].posicion << " ";
            }
            cout << perdida << endl;
            
            //            cout << cantJoyas << " " << t << endl;
            
            primerLinea = true;
            i = 0;
        }
        
        if (line[0] == '0') {
            break;
        }
        
                if (primerLinea){
                        cantJoyas = atoi(line.c_str());
                        joyas = new tupla[cantJoyas];
                        primerLinea = false;
            
                } else {
            vector<string> entradaSplit;
            int fromIndex = 0;
            int length = 0;
            for(int i=0; i<line.length(); i++) {
                if(i == line.length() - 1) {
                    length++;
                    entradaSplit.push_back(line.substr(fromIndex, length));
                } else if(line[i] == ' ') {
                    entradaSplit.push_back(line.substr(fromIndex, length));
                    fromIndex = i+1;
                    length = 0;
                } else {
                    length++;
                }
            }
            int i_costo = atoi(entradaSplit[0].c_str());
            int i_tiempo = atoi(entradaSplit[1].c_str());
            tupla nueva = {i_costo,i_tiempo,i+1};
            joyas[i] = nueva;
            i++;
        }
        }
    
        return 0;
        
}
